ããã©ãŒãã³ã¹åäžã®ããã«æäœãçµåããæè¡ãJavaScriptã€ãã¬ãŒã¿ãã«ããŒã®ã¹ããªãŒã ãã¥ãŒãžã§ã³æé©åãæ¢æ±ããŸãããã®ä»çµã¿ãšåœ±é¿ã«ã€ããŠåŠã³ãŸãããã
JavaScriptã€ãã¬ãŒã¿ãã«ããŒã®ã¹ããªãŒã ãã¥ãŒãžã§ã³æé©åïŒæäœã®çµå
çŸä»£ã®JavaScriptéçºã§ã¯ãããŒã¿ã®ã³ã¬ã¯ã·ã§ã³ãæ±ãããšã¯äžè¬çãªã¿ã¹ã¯ã§ãã颿°åããã°ã©ãã³ã°ã®ååã¯ãmapãfilterãreduceã®ãããªã€ãã¬ãŒã¿ãšãã«ããŒé¢æ°ã䜿çšããŠããŒã¿ãåŠçãããšã¬ã¬ã³ããªæ¹æ³ãæäŸããŸãããããããããã®æäœãåçŽã«é£éããããšãããã©ãŒãã³ã¹ã®éå¹çã«ã€ãªããå¯èœæ§ããããŸããããã§ãã€ãã¬ãŒã¿ãã«ããŒã®ã¹ããªãŒã ãã¥ãŒãžã§ã³æé©åãç¹ã«æäœã®çµåãéèŠã«ãªããŸãã
åé¡ã®çè§£ïŒéå¹çãªé£é
次ã®äŸãèããŠã¿ãŸãããïŒ
const numbers = [1, 2, 3, 4, 5];
const result = numbers
.map(x => x * 2)
.filter(x => x > 5)
.reduce((acc, x) => acc + x, 0);
console.log(result); // åºå: 18
ãã®ã³ãŒãã¯ããŸãåæ°å€ã2åã«ããæ¬¡ã«5以äžã®æ°å€ãé€å€ããæåŸã«æ®ãã®æ°å€ãåèšããŸããæ©èœçã«ã¯æ£ããã§ããããã®ã¢ãããŒãã¯è€æ°ã®äžéé
åãå«ãããéå¹çã§ããåmapããã³filteræäœã¯æ°ããé
åãäœæãããããã¡ã¢ãªãšåŠçæéãæ¶è²»ããŸããå€§èŠæš¡ãªããŒã¿ã»ããã®å Žåããã®ãªãŒããŒãããã¯é倧ã«ãªãå¯èœæ§ããããŸãã
éå¹çæ§ã®å èš³ã¯æ¬¡ã®ãšããã§ãïŒ
- è€æ°åã®ã€ãã¬ãŒã·ã§ã³ïŒ åæäœãå ¥åé åå šäœãå埩åŠçããŸãã
- äžéé åïŒ åæäœãçµæãæ ŒçŽããããã«æ°ããé åãäœæããã¡ã¢ãªå²ãåœãŠãšã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®ãªãŒããŒããããåŒãèµ·ãããŸãã
解決çïŒã¹ããªãŒã ãã¥ãŒãžã§ã³ãšæäœã®çµå
ã¹ããªãŒã ãã¥ãŒãžã§ã³ïŒãŸãã¯æäœã®çµåïŒã¯ãè€æ°ã®æäœãåäžã®ã«ãŒãã«ãŸãšããããšã§ããããã®éå¹çæ§ãåæžããããšãç®çãšããæé©åæè¡ã§ããäžéé åãäœæãã代ããã«ãèåãããæäœã¯åèŠçŽ ãäžåºŠã ãåŠçãããã¹ãŠã®å€æãšãã£ã«ã¿ãªã³ã°æ¡ä»¶ãåäžã®ãã¹ã§é©çšããŸãã
äžå¿çãªã¢ã€ãã¢ã¯ãäžé£ã®æäœãå¹ççã«å®è¡ã§ããåäžã®æé©åããã颿°ã«å€æããããšã§ããããã¯å€ãã®å Žåããã©ã³ã¹ãã¥ãŒãµãŒãåæ§ã®æè¡ã®äœ¿çšãéããŠéæãããŸãã
æäœã®çµåã®ä»çµã¿
åã®äŸã«æäœã®çµåãã©ã®ããã«é©çšã§ãããã説æããŸããããmapãšfilterãå¥ã
ã«å®è¡ãã代ããã«ãäž¡æ¹ã®å€æãåæã«é©çšããåäžã®æäœã«çµåã§ããŸãã
ãããéæããäžã€ã®æ¹æ³ã¯ãåäžã®ã«ãŒãå ã§ããžãã¯ãæåã§çµã¿åãããããšã§ãããããã¯ããã«è€éã«ãªããä¿å®ãå°é£ã«ãªãå¯èœæ§ããããŸãããããšã¬ã¬ã³ããªè§£æ±ºçã¯ããã©ã³ã¹ãã¥ãŒãµãŒãã¹ããªãŒã ãã¥ãŒãžã§ã³ãèªåçã«å®è¡ããã©ã€ãã©ãªãçšãã颿°åã¢ãããŒãã䜿çšããããšã§ãã
仮説çãªãã¥ãŒãžã§ã³ã©ã€ãã©ãªã䜿çšããäŸïŒãã¢ã³ã¹ãã¬ãŒã·ã§ã³ç®çïŒïŒ
JavaScriptã®æšæºã®é
åã¡ãœããã¯ãã€ãã£ãã§ã¹ããªãŒã ãã¥ãŒãžã§ã³ããµããŒãããŠããŸãããããããå®çŸããããã®ã©ã€ãã©ãªãäœæããããšãã§ããŸããäžè¬çãªé
åæäœã®èåçãæäŸããstreamfusionãšãã仮説çãªã©ã€ãã©ãªãæ³åããŠã¿ãŸãããã
// 仮説çãªstreamfusionã©ã€ãã©ãª
const streamfusion = {
mapFilterReduce: (array, mapFn, filterFn, reduceFn, initialValue) => {
let accumulator = initialValue;
for (let i = 0; i < array.length; i++) {
const mappedValue = mapFn(array[i]);
if (filterFn(mappedValue)) {
accumulator = reduceFn(accumulator, mappedValue);
}
}
return accumulator;
}
};
const numbers = [1, 2, 3, 4, 5];
const result = streamfusion.mapFilterReduce(
numbers,
x => x * 2, // mapFn
x => x > 5, // filterFn
(acc, x) => acc + x, // reduceFn
0 // initialValue
);
console.log(result); // åºå: 18
ãã®äŸã§ã¯ã`streamfusion.mapFilterReduce`ã¯mapãfilterãããã³reduceæäœãåäžã®é¢æ°ã«çµåããŸãããã®é¢æ°ã¯é
åãäžåºŠã ãå埩åŠçããåäžã®ãã¹ã§å€æãšãã£ã«ã¿ãªã³ã°æ¡ä»¶ãé©çšãããããããã©ãŒãã³ã¹ãåäžããŸãã
ãã©ã³ã¹ãã¥ãŒãµãŒïŒããäžè¬çãªã¢ãããŒã
ãã©ã³ã¹ãã¥ãŒãµãŒã¯ãã¹ããªãŒã ãã¥ãŒãžã§ã³ãéæããããã®ããäžè¬çã§åæå¯èœãªæ¹æ³ãæäŸããŸãããã©ã³ã¹ãã¥ãŒãµãŒã¯ããªãã¥ãŒã·ã³ã°é¢æ°ã倿ãã颿°ã§ããããã«ãããæäœãå³åº§ã«å®è¡ããããšãªã倿ã®ãã€ãã©ã€ã³ãå®çŸ©ã§ããå¹ççãªæäœã®çµåãå¯èœã«ãªããŸãã
ãã©ã³ã¹ãã¥ãŒãµãŒããŒãããå®è£ ããã®ã¯è€éãªå ŽåããããŸãããRamda.jsãtransducers-jsã®ãããªã©ã€ãã©ãªã¯ãJavaScriptã§ã®ãã©ã³ã¹ãã¥ãŒãµãŒã匷åã«ãµããŒãããŠããŸãã
Ramda.jsã䜿çšããäŸã以äžã«ç€ºããŸãïŒ
const R = require('ramda');
const numbers = [1, 2, 3, 4, 5];
const transducer = R.compose(
R.map(x => x * 2),
R.filter(x => x > 5)
);
const result = R.transduce(transducer, R.add, 0, numbers);
console.log(result); // åºå: 18
ãã®äŸã§ã¯ïŒ
R.composeã¯ãmapãšfilteræäœã®åæãäœæããŸããR.transduceã¯ãR.addããªãã¥ãŒã·ã³ã°é¢æ°ã0ãåæå€ãšããŠäœ¿çšããé åã«ãã©ã³ã¹ãã¥ãŒãµãŒãé©çšããŸãã
Ramda.jsã¯å éšçã«æäœãçµåããããšã§å®è¡ãæé©åããäžéé åã®äœæãåé¿ããŸãã
ã¹ããªãŒã ãã¥ãŒãžã§ã³ãšæäœã®çµåã®å©ç¹
- ããã©ãŒãã³ã¹ã®åäžïŒ ã€ãã¬ãŒã·ã§ã³ã®åæ°ãšã¡ã¢ãªå²ãåœãŠãåæžããç¹ã«å€§èŠæš¡ãªããŒã¿ã»ããã«ãããŠå®è¡æéãççž®ããŸãã
- ã¡ã¢ãªæ¶è²»éã®åæžïŒ äžéé åã®äœæãåé¿ããã¡ã¢ãªäœ¿çšéãšã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®ãªãŒããŒããããæå°éã«æããŸãã
- ã³ãŒãã®å¯èªæ§ã®åäžïŒ Ramda.jsã®ãããªã©ã€ãã©ãªã䜿çšãããšãã³ãŒãããã宣èšçã§çè§£ãããããªããŸãã
- åæå¯èœæ§ã®åŒ·åïŒ ãã©ã³ã¹ãã¥ãŒãµãŒã¯ãè€éãªããŒã¿å€æãã¢ãžã¥ãŒã«åŒã§åå©çšå¯èœãªæ¹æ³ã§æ§æããããã®åŒ·åãªã¡ã«ããºã ãæäŸããŸãã
ã¹ããªãŒã ãã¥ãŒãžã§ã³ã䜿çšããå Žé¢
ã¹ããªãŒã ãã¥ãŒãžã§ã³ã¯ã次ã®ãããªã·ããªãªã§æãæçã§ãïŒ
- å€§èŠæš¡ãªããŒã¿ã»ããïŒ å€§éã®ããŒã¿ãåŠçããå Žåãäžéé åãåé¿ããããšã«ããããã©ãŒãã³ã¹ã®åäžã¯é¡èã«ãªããŸãã
- è€éãªããŒã¿å€æïŒ è€æ°ã®å€æãšãã£ã«ã¿ãªã³ã°æ¡ä»¶ãé©çšããå Žåãã¹ããªãŒã ãã¥ãŒãžã§ã³ã¯å¹çãå€§å¹ ã«åäžãããããšãã§ããŸãã
- ããã©ãŒãã³ã¹ãéèŠãªã¢ããªã±ãŒã·ã§ã³ïŒ ããã©ãŒãã³ã¹ãæåªå ãããã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã¹ããªãŒã ãã¥ãŒãžã§ã³ã¯ããŒã¿åŠçãã€ãã©ã€ã³ã®æé©åã«åœ¹ç«ã¡ãŸãã
å¶éãšèæ ®äºé
- ã©ã€ãã©ãªãžã®äŸåïŒ ã¹ããªãŒã ãã¥ãŒãžã§ã³ãå®è£ ããã«ã¯ãRamda.jsãtransducers-jsãªã©ã®å€éšã©ã€ãã©ãªã䜿çšããå¿ èŠãããããšãå€ãããããžã§ã¯ãã®äŸåé¢ä¿ãå¢ããå¯èœæ§ããããŸãã
- è€éãïŒ ãã©ã³ã¹ãã¥ãŒãµãŒã®çè§£ãšå®è£ ã¯è€éã§ããã颿°åããã°ã©ãã³ã°ã®æŠå¿µããã£ãããšçè§£ããŠããå¿ èŠããããŸãã
- ãããã°ïŒ èåãããæäœã®ãããã°ã¯ãå®è¡ãããŒãæç€ºçã§ãªããããåã ã®æäœããããã°ãããããå°é£ãªå ŽåããããŸãã
- åžžã«å¿ èŠãšã¯éããªãïŒ å°èŠæš¡ãªããŒã¿ã»ãããåçŽãªå€æã®å Žåãã¹ããªãŒã ãã¥ãŒãžã§ã³ã䜿çšãããªãŒããŒããããå©ç¹ãäžåãå¯èœæ§ããããŸããã¹ããªãŒã ãã¥ãŒãžã§ã³ãæ¬åœã«å¿ èŠãã©ããã倿ããããã«ãåžžã«ã³ãŒãã®ãã³ãããŒã¯ãåã£ãŠãã ããã
å®äžçã®äŸãšãŠãŒã¹ã±ãŒã¹
ã¹ããªãŒã ãã¥ãŒãžã§ã³ãšæäœã®çµåã¯ã以äžãå«ãããŸããŸãªåéã§é©çšå¯èœã§ãïŒ
- ããŒã¿åæïŒ çµ±èšåæãããŒã¿ãã€ãã³ã°ãæ©æ¢°åŠç¿ã®ããã®å€§èŠæš¡ããŒã¿ã»ããã®åŠçã
- WebéçºïŒ APIãããŒã¿ããŒã¹ããåãåã£ãããŒã¿ã倿ã»ãã£ã«ã¿ãªã³ã°ãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã«è¡šç€ºããã äŸãã°ãeã³ããŒã¹APIãã倧éã®ååãªã¹ããååŸãããŠãŒã¶ãŒã®å¥œã¿ã«åºã¥ããŠãã£ã«ã¿ãªã³ã°ãããããŠUIã³ã³ããŒãã³ãã«ãããã³ã°ããããšãæ³åããŠã¿ãŠãã ãããã¹ããªãŒã ãã¥ãŒãžã§ã³ã¯ãã®ããã»ã¹ãæé©åã§ããŸãã
- ã²ãŒã éçºïŒ ãã¬ã€ã€ãŒã®äœçœ®ããªããžã§ã¯ãã®ããããã£ãè¡çªæ€åºãªã©ã®ã²ãŒã ããŒã¿ããªã¢ã«ã¿ã€ã ã§åŠçããã
- éèã¢ããªã±ãŒã·ã§ã³ïŒ æ ªäŸ¡ãååŒèšé²ããªã¹ã¯è©äŸ¡ãªã©ã®éèããŒã¿ãåæããã 倧éã®æ ªåŒååŒããŒã¿ã»ãããåæããç¹å®ã®ååŒé以äžã®ååŒãé€å€ãããããŠæ®ãã®ååŒã®å¹³åäŸ¡æ Œãèšç®ããããšãèããŠã¿ãŠãã ããã
- ç§åŠæè¡èšç®ïŒ ç§åŠç ç©¶ã«ãããè€éãªã·ãã¥ã¬ãŒã·ã§ã³ãããŒã¿åæã®å®è¡ã
äŸïŒEã³ããŒã¹ããŒã¿ã®åŠçïŒã°ããŒãã«ãªèŠç¹ïŒ
ã°ããŒãã«ã«å±éããeã³ããŒã¹ãã©ãããã©ãŒã ãæ³åããŠã¿ãŠãã ããã ãã®ãã©ãããã©ãŒã ã¯ãããŸããŸãªå°åããã®å€§éã®è£œåã¬ãã¥ãŒããŒã¿ã»ãããåŠçãã顧客ã®å ±éã®ææ ãç¹å®ããå¿ èŠããããŸãã ããŒã¿ã«ã¯ãç°ãªãèšèªã§ã®ã¬ãã¥ãŒã1ãã5ã®ã¹ã±ãŒã«ã®è©äŸ¡ãã¿ã€ã ã¹ã¿ã³ããªã©ãå«ãŸãããããããŸããã
åŠçãã€ãã©ã€ã³ã«ã¯ã次ã®ã¹ããããå«ãŸããå¯èœæ§ããããŸãïŒ
- è©äŸ¡ã3æªæºã®ã¬ãã¥ãŒãé€å€ããïŒåŠå®çããã³äžç«çãªãã£ãŒãããã¯ã«çŠç¹ãåœãŠãããïŒã
- ææ åæã®ããã«ã¬ãã¥ãŒãå ±éèšèªïŒäŸïŒè±èªïŒã«ç¿»èš³ããïŒãã®ã¹ãããã¯ãªãœãŒã¹ã倧éã«æ¶è²»ããŸãïŒã
- ææ åæãå®è¡ããŠãåã¬ãã¥ãŒã®å šäœçãªææ ã倿ããã
- ææ ã¹ã³ã¢ãéèšããŠã顧客ã®å ±éã®æžå¿µäºé ãç¹å®ããã
ã¹ããªãŒã ãã¥ãŒãžã§ã³ããªããã°ããããã®åã¹ãããã¯ããŒã¿ã»ããå šäœãå埩åŠçããäžéé åãäœæããããšã«ãªããŸãã ããããã¹ããªãŒã ãã¥ãŒãžã§ã³ã䜿çšããããšã§ããããã®æäœã¯åäžã®ãã¹ã«çµåãããç¹ã«äžçäžã®é¡§å®¢ããã®äœçŸäžãã®ã¬ãã¥ãŒãæ±ãå Žåã«ãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããã¡ã¢ãªæ¶è²»éãåæžãããŸãã
代æ¿ã¢ãããŒã
ã¹ããªãŒã ãã¥ãŒãžã§ã³ã¯å€§ããªããã©ãŒãã³ã¹äžã®å©ç¹ããããããŸãããããŒã¿åŠçã®å¹çãåäžãããããã«ä»ã®æé©åæè¡ã䜿çšã§ããŸãïŒ
- é å»¶è©äŸ¡ïŒ çµæãå®éã«å¿ èŠã«ãªããŸã§æäœã®å®è¡ãé ãããããšã ããã«ãããäžèŠãªèšç®ãã¡ã¢ãªå²ãåœãŠãåé¿ã§ããŸãã
- ã¡ã¢åïŒ é«ã³ã¹ããªé¢æ°åŒã³åºãã®çµæããã£ãã·ã¥ããŠãåèšç®ãåé¿ããããšã
- ããŒã¿æ§é ïŒ æå
ã®ã¿ã¹ã¯ã«é©ããããŒã¿æ§é ãéžæããããšã äŸãã°ãã¡ã³ããŒã·ãããã¹ãã«
Arrayã®ä»£ããã«Setã䜿çšãããšãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããŸãã - WebAssemblyïŒ èšç®è² è·ã®é«ãã¿ã¹ã¯ã«ã¯ãWebAssemblyã䜿çšããŠãã€ãã£ãã«è¿ãããã©ãŒãã³ã¹ãå®çŸããããšãæ€èšããŠãã ããã
çµè«
JavaScriptã€ãã¬ãŒã¿ãã«ããŒã®ã¹ããªãŒã ãã¥ãŒãžã§ã³æé©åãç¹ã«æäœã®çµåã¯ãããŒã¿åŠçãã€ãã©ã€ã³ã®ããã©ãŒãã³ã¹ãåäžãããããã®åŒ·åãªæè¡ã§ããè€æ°ã®æäœãåäžã®ã«ãŒãã«çµåããããšã§ãã€ãã¬ãŒã·ã§ã³ã®åæ°ãã¡ã¢ãªå²ãåœãŠãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®ãªãŒããŒããããåæžããå®è¡æéã®ççž®ãšã¡ã¢ãªæ¶è²»éã®åæžã«ã€ãªãããŸããã¹ããªãŒã ãã¥ãŒãžã§ã³ã®å®è£ ã¯è€éãªå ŽåããããŸãããRamda.jsãtransducers-jsã®ãããªã©ã€ãã©ãªã¯ãã®æé©åæè¡ã匷åã«ãµããŒãããŠããŸãã å€§èŠæš¡ãªããŒã¿ã»ããã®åŠçãè€éãªããŒã¿å€æã®é©çšããŸãã¯ããã©ãŒãã³ã¹ãéèŠãªã¢ããªã±ãŒã·ã§ã³ã§ã®äœæ¥ã®éã«ã¯ãã¹ããªãŒã ãã¥ãŒãžã§ã³ã®äœ¿çšãæ€èšããŠãã ããããã ããã¹ããªãŒã ãã¥ãŒãžã§ã³ãæ¬åœã«å¿ èŠãã©ããã倿ããããã«åžžã«ã³ãŒãã®ãã³ãããŒã¯ãåãã远å ãããè€éããšå©ç¹ãæ¯èŒæ€èšããŠãã ããã ã¹ããªãŒã ãã¥ãŒãžã§ã³ãšæäœã®çµåã®ååãçè§£ããããšã§ãã°ããŒãã«ãªã¢ããªã±ãŒã·ã§ã³ã«ã广çã«ã¹ã±ãŒã«ãããããå¹ççã§ããã©ãŒãã³ã¹ã®é«ãJavaScriptã³ãŒããæžãããšãã§ããŸãã